﻿@page "/news/release-notes/095"

<Seo Canonical="news/release-notes/095" Title="Blazorise v0.9.5" Description="Blazorise v0.9.5 release notes and changelog." />

<NewsPageTitle>
    Announcing Blazorise 0.9.5
</NewsPageTitle>

<NewsPagePostInto UserName="Mladen Macanović" ImageName="mladen" PostedOn="November 15, 2021" Read="8 min 40 sec" />

<Paragraph>
    Today, we are happy to announce the release of Blazorise 0.9.5. In this post, we’re covering a lot of the new Blazorise features
    that will make your app development easier to build and use.
</Paragraph>

<Paragraph>
    As you have probably noticed, we're also bringing completely new documentation pages built on top of Blazorise. When Blazorise was first created almost four years ago, Blazor was limited to very basic features. There was no server-side, no way to do the proper SEO, etc. And so, the only way to do the proper documentation at the time was to use GitHub pages. As time went by, with all the work on new features, documentation was always last to go. But this time Blazorise's documentation is built from the ground up, completely with Blazor and Blazorise. We now support real code examples, copy/paste snippets, hide/show code. Many new examples are included and with time we will include even more of them. We hope you will enjoy using the new docs as much as we enjoyed creating them.
</Paragraph>

<Paragraph>
    Old documentation will still be available at <Anchor To="https://v094.blazorise.com/">v094.blazorise.com</Anchor>.
</Paragraph>

<NewsPageSubtitle>
    Blazorise 0.9.5 Highlights 💡
</NewsPageSubtitle>

<UnorderedList>
    <UnorderedListItem>
        <Strong>Bootstrap 5 Provider</Strong> is our new completelly new CSS framework that we fully support.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>.NET 6</Strong> is now fully supported with this release.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>JavaScript Modules</Strong> to load internal JavaScript on demand without the need for any manual code.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>Autocomplete tags</Strong> now has support for multiple selection that will show selected items as tags.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>DataGrid</Strong> improvements and optimizations.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>Public Async methods</Strong> make it easier to prevent race condition when calling component directly.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>ColorPicker component</Strong> based upon the excellent <Anchor To="https://github.com/Simonwep/pickr">pickr</Anchor> library.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>InputMask component</Strong> based upon the excellent <Anchor To="https://github.com/RobinHerbots/Inputmask">Input Mask plugin</Anchor>.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>Theme improvements</Strong> to make it even easier to customize your apps without the need for CSS.
    </UnorderedListItem>
    <UnorderedListItem>
        <Strong>ListView component</Strong> for displaying a series of content in a contained scrollable view by providing a data source.
    </UnorderedListItem>
</UnorderedList>

<NewsPageSubtitle>
    Migration 🛠
</NewsPageSubtitle>

<Paragraph>
    No big release can be done without some breaking changes and this release is no exception. Considering this is the last <Code>0.9.*</Code>
    release before <Code>1.0</Code>, there was no other time. We tried to make the changes to a minimum but nevertheless, you will need to
    adjust your code. Here are the required steps that needs to be done:
</Paragraph>

<Paragraph>
    <Strong>1.</Strong> Changed all the following methods from synchronous to asynchronous.
</Paragraph>

<Table FullWidth Narrow Striped Bordered>
    <TableHeader ThemeContrast="ThemeContrast.Light">
        <TableRow>
            <TableHeaderCell>Component Name</TableHeaderCell>
            <TableHeaderCell>Before</TableHeaderCell>
            <TableHeaderCell>After</TableHeaderCell>
        </TableRow>
    </TableHeader>
    <TableBody>
        <TableRow>
            <TableRowCell>Modal</TableRowCell>
            <TableRowCell><Code>void Show()</Code></TableRowCell>
            <TableRowCell><Code>Task Show()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Hide()</Code></TableRowCell>
            <TableRowCell><Code>Task Hide()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>Action&lt;ModalClosingEventArgs&gt;</Code></TableRowCell>
            <TableRowCell><Code>Func&lt;ModalClosingEventArgs, Task&gt;</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Alert</TableRowCell>
            <TableRowCell><Code>void Show()</Code></TableRowCell>
            <TableRowCell><Code>Task Show()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Hide()</Code></TableRowCell>
            <TableRowCell><Code>Task Hide()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Toggle()</Code></TableRowCell>
            <TableRowCell><Code>Task Toggle()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Dropdown</TableRowCell>
            <TableRowCell><Code>void Show()</Code></TableRowCell>
            <TableRowCell><Code>Task Show()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Hide()</Code></TableRowCell>
            <TableRowCell><Code>Task Hide()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Toggle()</Code></TableRowCell>
            <TableRowCell><Code>Task Toggle()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>BarDropdown</TableRowCell>
            <TableRowCell><Code>void Show()</Code></TableRowCell>
            <TableRowCell><Code>Task Show()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Hide()</Code></TableRowCell>
            <TableRowCell><Code>Task Hide()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Toggle()</Code></TableRowCell>
            <TableRowCell><Code>Task Toggle()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Button</TableRowCell>
            <TableRowCell><Code>void Focus()</Code></TableRowCell>
            <TableRowCell><Code>Task Focus()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Collapse</TableRowCell>
            <TableRowCell><Code>void Toggle()</Code></TableRowCell>
            <TableRowCell><Code>Task Toggle()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>DropdownList</TableRowCell>
            <TableRowCell><Code>void Focus()</Code></TableRowCell>
            <TableRowCell><Code>Task Focus()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>DropdownToggle</TableRowCell>
            <TableRowCell><Code>void Focus()</Code></TableRowCell>
            <TableRowCell><Code>Task Focus()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>ListGroup</TableRowCell>
            <TableRowCell><Code>void SelectItem()</Code></TableRowCell>
            <TableRowCell><Code>Task SelectItem()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>ProgressBar</TableRowCell>
            <TableRowCell><Code>void Animate()</Code></TableRowCell>
            <TableRowCell><Code>Task Animate()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Steps</TableRowCell>
            <TableRowCell><Code>void SelectStep()</Code></TableRowCell>
            <TableRowCell><Code>Task SelectStep()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>StepsContent</TableRowCell>
            <TableRowCell><Code>void SelectPanel()</Code></TableRowCell>
            <TableRowCell><Code>Task SelectPanel()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Tabs</TableRowCell>
            <TableRowCell><Code>void SelectTab()</Code></TableRowCell>
            <TableRowCell><Code>Task SelectTab()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>TabsContent</TableRowCell>
            <TableRowCell><Code>void SelectPanel()</Code></TableRowCell>
            <TableRowCell><Code>Task SelectPanel()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Validations</TableRowCell>
            <TableRowCell><Code>void ValidateAll()</Code></TableRowCell>
            <TableRowCell><Code>Task ValidateAll()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void ClearAll()</Code></TableRowCell>
            <TableRowCell><Code>Task ClearAll()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>SelectList</TableRowCell>
            <TableRowCell><Code>void Focus()</Code></TableRowCell>
            <TableRowCell><Code>Task Focus()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Autocomplete</TableRowCell>
            <TableRowCell><Code>void Focus()</Code></TableRowCell>
            <TableRowCell><Code>Task Focus()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>ALL input components</TableRowCell>
            <TableRowCell><Code>void Focus()</Code></TableRowCell>
            <TableRowCell><Code>Task Focus()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void FocusAsync()</Code></TableRowCell>
            <TableRowCell><strong>removed</strong></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell>Snackbar</TableRowCell>
            <TableRowCell><Code>void Show()</Code></TableRowCell>
            <TableRowCell><Code>Task Show()</Code></TableRowCell>
        </TableRow>
        <TableRow>
            <TableRowCell></TableRowCell>
            <TableRowCell><Code>void Hide()</Code></TableRowCell>
            <TableRowCell><Code>Task Hide()</Code></TableRowCell>
        </TableRow>
    </TableBody>
</Table>

<Paragraph>
    <Strong>2.</Strong> Remove <Code>NotificationType</Code>, <Code>Message</Code>, and <Code>Title</Code> parameters from the <Code Tag>NotificationAlert</Code>.
</Paragraph>

<Paragraph>
    <Strong>3.</Strong> Remove <Code>Title</Code> component and replace it with the <Code>Heading</Code> component.
</Paragraph>

<Paragraph>
    <Strong>4.</Strong> We've found that on <Code>Dropdown</Code> we had both a <Code>VisibleChanged</Code> and <Code>Toggled</Code> event, which served the same purpose. We've removed <Code>Toggled</Code> and changed <Code>VisibleChanged</Code> to a regular Blazor <Code>EventCallback</Code>.

    Replace any <Code>Toggled</Code> Parameter with the <Code>VisibleChanged</Code> Parameter.

    Change any <Code>VisibleChanged</Code> event you might've bound to be compliant with a regular Blazor <Code>EventCallback</Code>.
</Paragraph>

<Paragraph>
    <Strong>5.</Strong> While not strictly a breaking changes, it is advised to also rename all <Code>Left</Code> and <Code>Right</Code> values,
    eg. for <Code>TextAlignment</Code> and <Code>Direction</Code>. We have marked them as obsolete and they will be replaced with
    <Code>Start</Code> and <Code>End</Code> values. The purpose of the new values is the better naming support for the RTL support
    that should take place in the next Blazorise version.
</Paragraph>

<Paragraph>
    <Strong>6.</Strong> We've changed the <Code>DataGrid</Code>'s <Code>RowSelectable</Code> evaluation to take in a <Code>RowSelectableEventArgs</Code> instead.
    This way we can provide you with increased information on the selection being handled.
    This new <Code>RowSelectableEventArgs</Code> will still give you access to the current row item and additionaly to the type of selection being done, <Code>RowClick</Code>, <Code>MultiSelectClick</Code>, <Code>MultiSelectAll</Code>
    You will need to change your <Code>RowSelectable</Code> handlers to expect a <Code>RowSelectableEventArgs</Code> instead.
</Paragraph>

<Paragraph>
    <Strong>7.</Strong> Remove Blazorise static files from <Code>index.html</Code>> or <Code>_Host.cshtml</Code>. Files that are safe to be removed are:
    <UnorderedList>
        <UnorderedListItem><Code>_content/Blazorise/blazorise.js</Code></UnorderedListItem>
        <UnorderedListItem><Code>_content/Blazorise.Bootstrap/blazorise.bootstrap.js</Code></UnorderedListItem>
        <UnorderedListItem><Code>_content/Blazorise.Charts/blazorise.charts.js</Code></UnorderedListItem>
        <UnorderedListItem><Code>_content/Blazorise.Charts.Streaming/blazorise.charts.streaming.js</Code></UnorderedListItem>
        <UnorderedListItem><Code>_content/Blazorise.DataGrid/blazorise.datagrid.js</Code></UnorderedListItem>
        <UnorderedListItem><Code>_content/Blazorise.Markdown/blazorise.markdown.js</Code></UnorderedListItem>
    </UnorderedList>
</Paragraph>

<NewsPageSubtitle>
    Highlights 🚀
</NewsPageSubtitle>

<Heading Size="HeadingSize.Is3">
    Bootstrap 5
</Heading>

<Paragraph>
    First and foremost, with this release, we finally introduce a new Bootstrap 5 provider. The new Bootstrap 5 is already put
    to a test and is now running our new documentation pages. You can also see it in <Anchor To="https://bootstrap5demo.blazorise.com/">our demos</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    .NET 6
</Heading>

<Paragraph>
    Now that the .NET 6 is out it is only natural that we want to support it. The old .NET 5 is still supported just in case there are projects that cannot upgrade at this time. Please note, we plan to drop support for .NET 5 once the Blazorise 1.0 is released sometime at the beginning of 2022. Considering that .NET 6 is going to be LTS and that it supports many new features it is the only way to move forward without .NET 5 holding us back.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    JavaScript modules
</Heading>

<Paragraph>
    We have refactored major parts of Blazorise internals to make use of <Anchor To="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules">JavaScript modules</Anchor>. As a result of all the hard work, we have made it easier to set up Blazorise projects, and manually importing Javascript static files is not needed anymore. All Blazorise static files can safely be removed from all your <Code>index.html</Code> and <Code>_Host.cshtml</Code> files.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Autocomplete:
</Heading>

<Heading Size="HeadingSize.Is4">
    1. Multiple Selection Support
</Heading>

<Paragraph>
    <Code>Autocomplete</Code> now has support for multiple selection by setting the new <Code>Multiple</Code> parameter to true. You have two extra Parameters at your disposal to handle the multiple values.
    <Code>SelectedValues</Code> and <Code>SelectedTexts</Code>
</Paragraph>

<Heading Size="HeadingSize.Is4">
    2. ItemContent template
</Heading>

<Paragraph>
    <Code>Autocomplete</Code> now has the ability to optionally enrinch each value presented to the user with your custom html, by providing a <Code>RenderFragment</Code>, called <Code>ItemContent</Code>.
</Paragraph>

<Paragraph>
    Both examples can be seen on the <Anchor To="docs/extensions/autocomplete">Autocomplete page</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    DataGrid:
</Heading>

<Heading Size="HeadingSize.Is4">
    Null Coalescing
</Heading>

<Paragraph>
    <Code>DataGrid</Code> <Code>Field</Code> now supports null coalescing, meaning you can now provide objects with null data, and <Code>DataGrid</Code> will set the <Code>Default</Code> Value for the respective <Code>Field</Code> <Code>Type</Code>.
</Paragraph>

<Heading Size="HeadingSize.Is4">
    Sort Field
</Heading>

<Paragraph>
    Introduced a new <Code>SortField</Code> Parameter, that allows you to define a different Property or Field of a column to be considered by the sorting mechanism.
</Paragraph>

<Heading Size="HeadingSize.Is4">
    DetailRowTemplate
</Heading>

<Paragraph>
    <Code>DataGrid</Code> <Code>DetailRowTemplate</Code> feature has been slightly reworked. Now it will evaluate <Code>DetailRowTrigger</Code> on click, avoiding multiple calls to this on datagrid re-renders.
</Paragraph>
<Paragraph>
    We've also introduced a new public API <Code>ToggleDetailRow</Code> so you can programatically toggle the row. By default, it evaluates <Code>DetailRowTrigger</Code>, but you may use the provided flag <Code>forceDetailRow</Code> to just force the row to show the <Code>DetailRowTemplate</Code>
</Paragraph>
<Paragraph>
    We've still maintained the old behaviour, if <Code>DetailRowTemplate</Code> is defined, every row will display <Code>DetailRowTemplate</Code>, if <Code>DetailRowTrigger</Code> is defined, this will still be evaluated for every row, but now only once the row is first initialized and no longer on every re-render.
</Paragraph>
<Paragraph>
    To disable this behaviour you may use the new <Code>Parameter</Code> <Code>DetailRowStartsVisible</Code> and <Code>DetailRowTemplate</Code> will only be evaluated on click and if programatically called.
</Paragraph>

<Heading Size="HeadingSize.Is4">
    DataGridColumn Non Mandatory Field Parameter
</Heading>

<Paragraph>
    <Code>DataGridColumn</Code> no longer requires <Code>Field</Code> to work. You may provide a <Code>DataGridColumn</Code> with no <Code>Field</Code>, however do take note, <Code>DataGrid</Code> will not do any internal management for these columns for you.
</Paragraph>

<Paragraph>
    All of the mentioned features and examples can be seen under the <Anchor To="docs/extensions/datagrid/getting-started">DataGrid pages</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Public Async methods
</Heading>

<Paragraph>
    For a long time, most of our public methods were made as synchronous, eg. <Code>modal.Show()</Code>, which made it hard to play nicely with the asynchronous calls that were done internally by the Blazorise. In this release, we made the decision to convert them all to asynchronous which I think in the long run will be worth all the extra work. The result is unfortunately a breaking change so you should go through your projects and carefully update the changed calls. You can find all the changes in the migration section of this page.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    ColorPicker component
</Heading>

<Paragraph>
    In many cases, a native color input is not good enough. For instance, native color input doesn't support opacity value or localization.
    With the introduction of the <Code>ColorPicker</Code> component, all of these limitations are now history. You can define any color,
    including the alpha value. You can localize the buttons, define a custom pallette for quick coloring, show or hide certain buttons,
    and many new features.
</Paragraph>

<Paragraph>
    You can see examples at the <Anchor To="docs/components/color-picker">ColorPicker page</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Markdown improvements
</Heading>

<Paragraph>
    We did a lot of improvements and new APIs on our Markdown component. It can now support toolbar customization, image uploading, theming, and many more.
</Paragraph>

<Paragraph>
    You can see examples at the <Anchor To="docs/extensions/markdown">Markdown page</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Theming improvements
</Heading>

<Paragraph>
    Theming also received some much needed changes.
</Paragraph>

<Heading Size="HeadingSize.Is4">Color variables for RGB(A) values</Heading>

<Paragraph>
    Along with the <Code>--b-theme-primary</Code> CSS variable we are now generating additional RGB(A) variables,
    namelly, <Code>--b-theme-primary-r</Code>, <Code>--b-theme-primary-g</Code>, <Code>--b-theme-primary-b</Code>,
    and <Code>--b-theme-primary-a</Code>.
</Paragraph>

<Heading Size="HeadingSize.Is4">Nullable options</Heading>

<Paragraph>
    Not so much big of a change but nevertheless, is needed. When defining theme options in some cases it is hard to tell
    when the CSS override should be applied. This small change will give us that ability.
</Paragraph>

<Heading Size="HeadingSize.Is4">Body options</Heading>

<Paragraph>
    It is now possible to define the <Code Tag>body</Code> background and text color. Once defined it will also properly assign the
    color for the <Code>TextColor.Body</Code> typography color value, where needed.
</Paragraph>

<Heading Size="HeadingSize.Is4">Spacing options</Heading>

<Paragraph>
    So far if you wanted to change the margin and padding sizes you would need to re-compile Bootstrap(or any other) CSS. With
    the new theming options it is now possible with just a few lines of code. And Blazorise will do all the magic for you. eg.
    <br />
    <br />
    <Code>SpacingOptions = new() { Is1 = ".5rem", Is2 = "1rem" }</Code>
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Tabs
</Heading>

<Paragraph>
    Introduced a new Parameter <Code>TabsMode</Code> which essentially defines how the tab content will load.
</Paragraph>

<DescriptionList>
    <DescriptionListTerm><Code>TabsMode.Default</Code></DescriptionListTerm>
    <DescriptionListDefinition>
        Will keep the same behaviour, we've had until now. Every tab is always rendered to the DOM and hidden if not active.
    </DescriptionListDefinition>
    <DescriptionListTerm><Code>TabsMode.LazyLoad</Code></DescriptionListTerm>
    <DescriptionListDefinition>
        Each tab will only be rendered/loaded the first time it is visited.
    </DescriptionListDefinition>
    <DescriptionListTerm><Code>TabsMode.LazyReload</Code></DescriptionListTerm>
    <DescriptionListDefinition>
        Only the active tab will have it's html rendered at a time. This also means that the content will always be re-calculated upon switching tabs.
    </DescriptionListDefinition>
</DescriptionList>

<Heading Size="HeadingSize.Is3">
    DropdownList
</Heading>

<Paragraph>
    <Code>DropdownList</Code> and <Code>DropdownMenu</Code> now support Scrolling as an opt-in feature. To set this, use the provided parameter <Code>MaxMenuHeight</Code>.
    This will make it so your DropdownLists with a lot of data, no longer keep growing indefinitely in size, going out of the page bounds.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    InputMask component
</Heading>

<Paragraph>
    The idea is to provide an easy way to increase input field readability by formatting your typed data. By using this component, you won't need to write any mind-blowing regular expressions or difficult mask patterns to format input text.
</Paragraph>

<Paragraph>
    You can see examples at the <Anchor To="docs/components/input-mask">InputMask page</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    ListView component
</Heading>

<Paragraph>
    Introduced the new <Code>ListView</Code> extension, which is based on our <Code>ListGroup</Code> behind the covers, so you may make use of the <Code>ListGroup</Code> underlying APIs.
</Paragraph>
<Paragraph>
    List views are a flexible and powerful component for displaying a series of content in a contained scrollable view by providing a data source.
</Paragraph>

<Paragraph>
    You can see examples at the <Anchor To="docs/extensions/list-view">ListView page</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Localization
</Heading>

<Paragraph>
    The <Code>DatePicker</Code> and <Code>TimePicker</Code> pickers are now fully localized with our <Anchor To="docs/helpers/localization">localization system</Anchor>.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Thank you!
</Heading>

<Paragraph>
    Thank you to everyone in the community who helped make this release of Blazorise possible! Also big thank you to all our community members that took their time and helped us by fixing issues and submitting the PRs.
</Paragraph>

<Paragraph>
    We hope you enjoy this release of Blazorise.
</Paragraph>

<Heading Size="HeadingSize.Is3">
    Closing
</Heading>

<Paragraph>
    Install Blazorise nugets, upgrade your projects, and tell us what you think! See you next time!
</Paragraph>

<NewsPostFollow />